//
//  SLHomeViewController.swift
//  0319iOSweiboDemo
//
//  Created by Tang on 16/3/19.
//  Copyright © 2016年 大天朝. All rights reserved.
//

import UIKit
import SVPullToRefresh

class SLHomeViewController: SLBaseTabbleViewController {

    private let ReuseIdentifierHome = "ReuseIdentifierHome"
    //MARK: - 属性
    var statuses: [SLStatus]? {
        didSet {
            self.tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //登录以后再做后面的操作
        if !SLUserAccountViewModel.sharedInstance.userLogin {
            return
        }
        //设置导航栏
        setupNavigationBar()
        setupTitleButton()
        //注册cell
        prepareTabbleView ()
    }
    
    private func prepareTabbleView() {
        //注册cell
        tableView.registerClass(SLStatusCell.self, forCellReuseIdentifier: ReuseIdentifierHome)
  
        //cell的高度根据cell里面的子控件来自动布局来确定高度
        //UITableViewAutomaticDimension根据约束来布局
        //cell里面约束要确定好.contenview的高度约束要根据子控件来.最终cell的高度会根据contenView的高度来
        tableView.rowHeight = UITableViewAutomaticDimension
        //添加预估行高
//        tableView.estimatedRowHeight = 100
        
        //取消cell的分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
        //上拉
        tableView.addPullDownRefreshingControlHandle ({ [weak self] () -> () in
//            SLPrint(msg: "开始刷新加载数据...")
            self?.loadNewStatus()
        })
        tableView.startRefreshing()
    }
    
    /**
        1.一进入程序下拉刷新和上拉加载同时获取数据:不能既在下拉刷新又在上拉刷新.因为AFN.GET是异步的.谁先会回来不确定
            当第一次获取最新数据完成后再添加上拉刷新加载更多功能
        2.用户网络不好,先下拉刷新.又上拉刷新加载.同时存在2个请求.只能同时存在一个网络请求
     */
    
    //下拉刷新
    private func loadNewStatus() {
        //获取id最大的微博.当没有微博数据.传0加载最新20条微博数据
        let since_id = self.statuses?.first?.id ?? 0
        
        //使用ViewModel加载数据
        SLStatusViewModel.sharedInstance.loadStatus(since_id, max_id: 0) { [weak self] (statuses, error) -> () in
            self?.tableView.endRefreshing()
            
            if error != nil {
                SLPrint(msg: "下拉刷新微博数据出错了: \(error)")
                return
            }
            
            let count = statuses?.count ?? 0
            
            if since_id > 0 {
                self?.showTipLabel(count)
            }
            if count == 0 {
                SLPrint(msg: "没有加载到微博")
                return
            }

            // 下拉刷新
            if since_id > 0 {
                SLPrint(msg: "下拉刷新count: \(count)")
                // 下拉刷新,需要将新获取到的数据添加到现有数据的前面,并且重新赋值
                self?.statuses = statuses! + self!.statuses!
            } else { // since_id = 0
//                SLPrint(msg: "第一次加载最新微博count: \(count)")
                // 加载最新20条数据
                self?.statuses = statuses
                
                // 当第一次获取最新数据完成后再添加上拉加载更多功能
                self?.tableView.addInfiniteScrollingWithActionHandler { () -> Void in
                    self?.loadMoreStatus()
                }
            }
//         SLPrint(msg: "最终微博数据条数: \(self?.statuses?.count)")
            
        }
    }
    ///加载更多微博数据.上拉加载数据
    private func loadMoreStatus() {
        let max_id = self.statuses?.last?.id ?? 0
        
        SLStatusViewModel.sharedInstance.loadStatus(0, max_id: max_id) { (statuses, error) -> () in
            //结束上拉刷新加载更多数据
            self.tableView.infiniteScrollingView.stopAnimating()
            
            if error != nil {
                SLPrint(msg: "上拉加载数据出错: \(error)")
                return
            }
            
            let count = statuses?.count ?? 0
            if count == 0 {
                SLPrint(msg: "上拉没有加载到微博")
                return
            }
            
            //上拉加载更多数据.将新的数据拼接到现有数据的后面
            self.statuses = self.statuses! + statuses!
//            SLPrint(msg: "上拉加载更多数据: \(statuses?.count)")
//            SLPrint(msg: "最终微博数据条数: \(self.statuses?.count)")
        }
    }
    
    /**
     显示下拉刷新的条数
     
     - parameter count: 下拉刷新的条数
     */
    private func showTipLabel(count: Int) {
        tipLabel.text = count == 0 ? "没有新的微博数据" : "更新了\(count)条微博数据"
        //不能往tableview上面加.不然 会跟着跑
        //动画叠加导致label还会往下走.UIView动画的底层也是核心动画
        let animationKeys = tipLabel.layer.animationKeys()
        if animationKeys != nil {
            SLPrint(msg: "有动画正在运行...:\(animationKeys)")
            //移除之前的动画
            tipLabel.layer.removeAllAnimations()
        }
        
        
        //动画
        UIView.animateWithDuration(SLDefaultDuration * 4, animations: { () -> Void in
//            UIView.setAnimationRepeatAutoreverses(true)//动画返回
//            UIView.setAnimationRepeatCount(5)//重复5次
            self.tipLabel.frame.origin.y = 44
            }) { (_) -> Void in
                UIView.animateWithDuration(SLDefaultDuration * 4, delay: SLDefaultDuration * 2, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                    
                    self.tipLabel.frame.origin.y = -64
                    
                    }, completion: nil) //{ (_) -> Void in
//                        SLPrint(msg: "动画完成了")
//                 self.tipLabel.removeFromSuperview()
//                 })
                
        }
    }
    
    //设置导航栏左右
    private func setupNavigationBar() {
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch", targer: self, action: "didClickLeftItem")
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop", targer: self, action: "didClickRightItem")
    }
    
    //设置导航栏标题
   private func setupTitleButton() {
    let name = SLUserAccountViewModel.sharedInstance.userAccount?.screen_name
        let titleButton = SLHomeTitleButton(title: name, imageName: "navigationbar_arrow_down")
    titleButton.addTarget(self, action: "didClickTitleButton:", forControlEvents: UIControlEvents.TouchUpInside)
        navigationItem.titleView = titleButton
    }
    
    //MARK: - 按钮的点击事件
    @objc private func didClickTitleButton(button: SLHomeTitleButton) {
        //当点击按钮的时候 selected 取反
        button.selected = !button.selected
        
        //按钮选中的时候箭头朝上.不选中就朝下
        //UIView旋转动画特点:1.两边一样远,顺时针.  2.哪边近就往哪边走

        UIView.animateWithDuration(SLDefaultDuration) { () -> Void in
            button.imageView?.transform = button.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.001)) :CGAffineTransformIdentity
        }
        
        if button.selected {
            let popoverVC = SLPopoverViewController()
            //设置model样式
            popoverVC.modalPresentationStyle = .Popover
            popoverVC.popoverPresentationController?.delegate = self
            //popover的箭头指向titleView  默认左上角
            popoverVC.popoverPresentationController?.sourceView = navigationItem.titleView
            //popover的箭头指向titlsourceRecteView
            popoverVC.popoverPresentationController?.sourceRect = navigationItem.titleView!.bounds
            //设置popover显示的大小
            popoverVC.preferredContentSize = CGSize(width: 200, height: 44 * popoverVC.titleS.count)
            //弹出
            presentViewController(popoverVC, animated: true, completion: nil)
        }
    }
    //左边按钮
    func didClickLeftItem() {
        SLPrint(msg: "didClickLeftItem")
    }
    //右边按钮
    func didClickRightItem() {
        SLPrint(msg: "didClickRightItem")
    }
    
    
    //取消cell的选中
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        //cell不要高亮
        return false
    }
    
    override func scrollViewDidScroll(scrollView: UIScrollView) {
        //不能再这里来设置刷新控件.不然刷新控件太依赖控制器.刷新控件服用比较麻烦
    }
    
    //懒加载
    private lazy var pullDownRefreshControl: SLPullDownRefreshControl = SLPullDownRefreshControl()

    //下拉刷新提示
    private lazy var tipLabel: UILabel = {
        let tipLabel = UILabel()
        tipLabel.backgroundColor = UIColor.orangeColor()
        tipLabel.textColor = UIColor.whiteColor()
        tipLabel.font = UIFont.systemFontOfSize(16)
        tipLabel.textAlignment = NSTextAlignment.Center
        tipLabel.frame = CGRect(x: 0, y: -64, width: UIScreen.width, height: 44)
        //往导航栏上面加
        self.navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
        return tipLabel
    }()
}


//MARK: - SLHomeViewController 协议  
//将tabbleView相关的方法写在这里
extension SLHomeViewController {
    /**
        tableView的优化:
            1.cell的复用
            2.图片加载(耗时操作)使用子线程(SDWebImage)
            3.IO操作(耗时操作),读取文件和写入文件,最好是在cell显示之前将文件的内容读取出来.保存在内存中
            4.缓存tableViewCell的行高,如果根据cell的约束确定行高,每当显示之前都需要计算
            5.不要使用预估行高,预估行高会使tableView的cell显示之前才去计算
            6.tableView.dequeueReusableCellWithIdentifier:forIndexPath: 会再次调用 tableView:heightForRowAtIndexPath 尽量少用
            7.cell里面的控件使用懒加载.用不到的隐藏掉.不要在cellForRowAtIndexPath里面创建和删除控件
            8.在tableView:cellForRowAtIndexPath 里面尽量少计算
            9.在图层圆角,阴影,会影响性能
            10.view或者图层尽量使用不透明的
            11.图片的拉伸和压缩等都会影响性能
            12.cell在滚动的时候不要去做动画
            13.cell里面的view的层次不要太多
            14.AsyncDisplayKit -> UIKit Node
    */
    //计算行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//        SLPrint(msg: "heightForRowAtIndexPath: \(indexPath)")
        //将行高缓存在模型中.cell的内容是根据模型来的.
        //1.去模型中看看有没有缓存的行高
        let status = self.statuses![indexPath.row]
        if status.rowHeight != nil {
            //模型中保存了行高
//            SLPrint(msg: "模型中保存了行高: \(indexPath), \(status.rowHeight!)")
            return status.rowHeight!
        }
//        SLPrint(msg: "没有缓存过行高")
        //没有缓存过行高
        //计算行高.autoLayout自动约束可以拿到这个行高
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierHome) as! SLStatusCell
        
        //将模型赋值给cell,cell会根据statu是里面的内容和autoLayout.会重新更新布局.cell没有拿去显示.只是计算行高
        cell.status = status
        
        //根据autoLayout和cell里面控件里面内容获取cell的高度
        let rowHeight = cell.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height
        
        //将计算好的行高保存到模型里面
        status.rowHeight = rowHeight
        return rowHeight;
    }
    //返回多少个cell
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       // statuses?.count = nil 的时候就不往后面走
        //statuses?.count ?? 0   两个问号前面的可选.没有值就使用??后面的
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierHome, forIndexPath: indexPath) as! SLStatusCell
         let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierHome) as! SLStatusCell
        //设置cell的内容
        //        cell.textLabel?.text = statuses?[indexPath.row].text
        
        cell.status = statuses?[indexPath.row]
        
        return cell
    }
}

//MARK: - UIPopoverPresentationControllerDelegate 代理
extension SLHomeViewController: UIPopoverPresentationControllerDelegate {
    //不让popover适配iPhone.默认适配全屏的   不适配就是popover效果
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }
    
    //关闭的时候调用
    func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool {
        //让箭头转下来
        let titleButton = navigationItem.titleView as! SLHomeTitleButton
        didClickTitleButton(titleButton)
       return true
    }
}

    
    

